# POST meiduo_admin/authorizations/
from django.contrib.auth.decorators import permission_required
from django.utils.decorators import method_decorator
from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAdminUser
from rest_framework.views import APIView
from meiduo_admin.serializers.users import AdminAuthSerializer, UserInfoSerializer
from rest_framework.response import Response
from rest_framework import status

from users.models import User


class AdminAutorizeView(APIView):

    def post(self,request):
        """
        管理员登录:
        1.接收参数,进行教验(参数完整性,用户名密码是否正确)
        2.服务器生成jwt token,(在jwt token中保存用户信息)
        3.返回数据给客户端
        """
        # 1. 接收参数并数据校验(参数完整性,用户名和密码是否正确)
        serializer = AdminAuthSerializer(data = request.data)
        serializer.is_valid(raise_exception=True)

        # 2.服务器生成jwt token,(在jwt token中保存用户信息)
        serializer.save() # 调用create方法

        # 3.返回数据给客户端
        # serializer.data 获取用户对象序列化之后的数据
        return Response(serializer.data,status=status.HTTP_201_CREATED)

# GET /meiduo_admin/users/?keyword=<搜索内容>&page=<页码>&pagesize=<页容量>
class UserInfoView(ListAPIView):
    permission_classes = [IsAdminUser]

    # 指定视图所使用的序列化器类
    serializer_class = UserInfoSerializer

    # 指定视图所使用的查询集
    def get_queryset(self):
        """重写GenericAPIView中的get_queryset"""
        # self.request  请求对象
        keyword = self.request.query_params.get('keyword')

        if not keyword:
            # 客户端不传递keyword 获取所有普通用户数据返回
            users = User.objects.filter(is_staff=False)
        else:
            # 客户端传递了keyword 查询username中包含了keyword的普通用户数据
            users = User.objects.filter(is_staff=False, username__contains=keyword)
        return users

    @method_decorator(permission_required('user.view_user_api',raise_exception=True))
    def get(self,request,*args,**kwargs):
        # 调用ListAPIView中的get方法
        return super().get(request,*args,**kwargs)

    # def get(self,request):
    #     # 调用ListModelMixin中的list返回
    #     return self.list(request)
    # def get(self,request):
    #     """
    #     获取普通用户数据:
    #     1. 查询数据库,获取keyword关键字
    #     1.1 客户端不传递keyword 获取所有普通用户数据返回
    #     1.2 客户端传递了keyword 查询username中包含了keyword的普通用户数据
    #     2. 将用户数据序列化并返回
    #     :param request:
    #     :return:
    #     """
    #     # 1.获取keyword关键字,查询普通用户数据
    #     users = self.get_queryset()
    #
    #     # 2.将用户数据序列化并返回
    #     serializer = self.get_serializer(users,many=True)
    #     return Response(serializer.data)